package action.RDD基本转换操作1

import org.apache.spark.{SparkConf, SparkContext}

/**
  * scala spark flatmap的使用
  * @author wdmcode@aliyun.com
  * @version 1.0.0
  * @date 2018/11/7
  */
object SparkFlatMap {
  /**
    * flatMap
    * 属于Transformation(转换)算子，第一步和map一样，最后将所有的输出分区合并成一个。
    */

  def main(args: Array[String]): Unit = {
    val conf = new SparkConf()
    conf.setMaster("local[2]")
    conf.setAppName("map")

    val spark = new SparkContext(conf);


    // 获取resource下的文件
    val filePath = SparkMap.getClass.getResource("/") + "hello.txt"

    val data = spark.textFile(filePath)
    /**
      * \\s表示   空格,回车,换行等空白符,
      * +号表示   一个或多个的意思
      */
    val collect = data.flatMap(line => line.split("\\s+"))

    collect.foreach(s=>println(s))

    // res1: Array[String] = Array(hello, world, hello, spark, hello, hive)

    /**
      * 使用flatMap时候需要注意：
      * flatMap会将字符串看成是一个字符数组。
      * 看下面的例子：
      */
    val dataList: List[String] = List("hello", "world", "hello", "spark", "hello", "hive")

    dataList.map(_.toUpperCase).foreach(s => println(s))
    // Array[String] = Array(HELLO WORLD, HELLO SPARK, HELLO HIVE, HI SPARK)

    dataList.flatMap(_.toUpperCase).foreach(s => println(s))
    //Array[Char] = Array(H, E, L, L, O,  , W, O, R, L, D, H, E, L, L, O,  , S, P, A, R, K, H, E, L, L, O,  , H, I, V, E, H, I,  , S, P, A, R, K)

    /**
      * flatmap和map区别
      * 具体详见 https://alvinalexander.com/scala/collection-scala-flatmap-examples-map-flatten
      *
      * 本示例中map函数中返回的类型为Array[String]，并不是String。
      * flatMap只会将String扁平化成字符数组，并不会把Array[String]也扁平化成字符数组。
      */

    spark.stop()
  }
}
